// 本质上也是通过axios调后端接口 所以需要导入
import axios from "axios";
// 给axios默认带一个响应的类型
const service = axios.create({
    responseType: 'arraybuffer' // 默认类型
})

// 通过service写请求拦截器
// 掉后端接口仍然需要验证request请求里面 有无Authorization的key,以及key对应的value 有对应的value才认为是处于登录状态才能掉接口
service.interceptors.request.use(config =>{
    config.headers['Authorization'] = window.sessionStorage.getItem('tokenStr');
    return config;
}, error =>{
    console.log(error);
})

// 响应拦截器
// ajax异步请求掉后端接口
service.interceptors.response.use(resp =>{
    const headers = resp.headers;
    // 定义一个正则表达式
    let reg = RegExp(/application\/json/);
    // 后端返回的数据大部分都是json字符串，少部分特殊接口返回流的形式
    if(headers['content-type'].match(reg)){ // 判断和正则表达式是否匹配 如果响应类型是application json
        resp.data = unitToString(resp.data);
    }else{
        // 如果不是 默认返回了一个string流
        let fileDownload = require('js-file-download'); //引进来的filedownload插件
        let fileName = headers['content-disposition'].split(';')[1].split('filename=')[1]; //文件名
        let contentType = headers['content-type']; // 响应类型
        fileName = decodeURIComponent(fileName); //文件名格式进行转换,防止中文乱码
        fileDownload(resp.data, fileName, contentType);
    }
}, error =>{
    console.log(error);
})

function unitToString(unitArray) {
    let encodeString = String.fromCharCode.apply(null, new Uint8Array(unitArray)); // 编码
    let decodeString = decodeURIComponent(escape(encodeString)); // 解码
    return JSON.parse(decodeString)
}

let base = '';
export const downloadRequest = (url, params) => {
    return service({
        method: 'get',
        url: `${base}${url}`,
        data: params
    })
}

// 将整体暴露出去，让其他地方调用
export default service